package com.fqy.thread03.readwrite;

import java.util.concurrent.TimeUnit;

/**
 * User: fqy
 * Date: 2021/9/4
 * Time: 9:33
 * Describe:
 * 读写锁
 *
 * 对于同一个资源，我们涉及多线程的操作，有读，有写，交替进行。
 * 为了保证读写的数据一致性,场景：读多写少+读写分离
 *
 * 读 读 可共享
 * 读 写 不共享
 * 写 写 不共享
 * 读的时候希望高并发同时进行，可以共享，可以多个线程同时操作进行中.....
 * 写的时候为了保证数据一致性，需要独占排它。
 *
 * 题目：5个线程读，5个线程写入，操作同一个资源
 *
 * 1 不加锁                不可以，写的时候原子性被破坏
 * 2 加ReentrantLock锁     写控制了，但是没有并发度，并发性能不好
 * 3 加读写锁               规范写入，写唯一，读并发
 */
public class ReadWriteLockDemo {

    public static void main(String[] args) {

        MyCache myCache = new MyCache();

        for (int i = 1; i <= 5; i++) {
            int finalI = i;
            new Thread(()->{
                myCache.write(finalI +"", finalI +"");
            }, String.valueOf(i)).start();

        }
        //暂停毫秒
        try { TimeUnit.MILLISECONDS.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }

        for (int i = 1; i <= 5; i++) {
            int finalI = i;
            new Thread(()->{
                myCache.read(finalI +"");
            }, String.valueOf(i)).start();

        }
    }
}
